﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TISModel;
using BTO;
using DAL;
using Exceptions;

namespace BLL
{
    public class BLLAgencia
    {
        public List<BTO.Agencia> list()
        {
            DALAgencia agencias = new DALAgencia();
            return agencias.list();
        }

        public BTO.Agencia getByID(int id)
        {
            DALAgencia dalAgencia = new DALAgencia();
			BTO.Agencia btoAgencia= dalAgencia.getByID(id);
			
			if (btoAgencia==null) {
				throw new NotFoundAgenciaException("Agencia não encontrada!");
			}
			
            return btoAgencia;

        }

        public BTO.Agencia getByName(String nome)
        {
            DALAgencia dalAgencia = new DALAgencia();
			BTO.Agencia btoAgencia= dalAgencia.getByName(nome);
			
			if (btoAgencia==null) {
				throw new NotFoundAgenciaException("Agencia não encontrada!");
			}
			
            return btoAgencia;
        }

        public BTO.Agencia getByCodAgencia(String codAgencia)
        {
            DALAgencia dalAgencia = new DALAgencia();
            BTO.Agencia btoAgencia = dalAgencia.getByCodAgencia(codAgencia);

            if (btoAgencia == null)
            {
                throw new NotFoundAgenciaException("Agencia não encontrada!");
            }

            return btoAgencia;
        }

        public void insert(BTO.Agencia toInsert)
        {
            DALAgencia dalAgencia = new DALAgencia();
			BTO.Agencia btoAgencia;

            if (toInsert.codAgencia == null || toInsert.codAgencia == ""
            || toInsert.nome == null || toInsert.nome == ""
            || toInsert.morada == null || toInsert.morada == ""
            || toInsert.codPostal == null || toInsert.codPostal == ""
            || toInsert.localidade == null || toInsert.localidade == ""
            || toInsert.telefone == null || toInsert.telefone == ""
            || toInsert.email == null || toInsert.email == ""
            || toInsert.responsavel == null || toInsert.responsavel == "") throw new InsertDadosAgenciaException("Verifique os campos obrigatórios!");

			btoAgencia = dalAgencia.getByCodAgencia(toInsert.codAgencia);
			if (btoAgencia!=null) {
				throw new CodAgenciaException("Já existe uma agencia com o código indicado!");
			}
			
			btoAgencia = dalAgencia.getByName(toInsert.nome);
			if (btoAgencia!=null) {
				throw new NomeAgenciaException("Já existe uma agencia com o nome indicado!");
			}
				
			try
            {
                dalAgencia.insert(toInsert);
            }
            catch (Exception e)
            {
                throw new InsertAgenciaException(e.Message);
            }

        }

        public void update(BTO.Agencia toUpdate)
        {
			DALAgencia dalAgencia = new DALAgencia();
			BTO.Agencia btoAgencia;

            if (toUpdate.codAgencia == null || toUpdate.codAgencia == ""
            || toUpdate.nome == null || toUpdate.nome == ""
            || toUpdate.morada == null || toUpdate.morada == ""
            || toUpdate.codPostal == null || toUpdate.codPostal == ""
            || toUpdate.localidade == null || toUpdate.localidade == ""
            || toUpdate.telefone == null || toUpdate.telefone == ""
            || toUpdate.email == null || toUpdate.email == ""
            || toUpdate.responsavel == null || toUpdate.responsavel == "") throw new InsertDadosAgenciaException("Verifique os campos obrigatórios!");

			btoAgencia = dalAgencia.getByCodAgencia(toUpdate.codAgencia);
			if (btoAgencia!=null && btoAgencia.IDAgencia!=toUpdate.IDAgencia) {
				throw new CodAgenciaException("Já existe uma agencia com o código indicado!");
			}
			
			btoAgencia = dalAgencia.getByName(toUpdate.nome);
			if (btoAgencia!=null && btoAgencia.IDAgencia!=toUpdate.IDAgencia) {
				throw new NomeAgenciaException("Já existe uma agencia com o nome indicado!");
			}
			
            try
            {
                dalAgencia.update(toUpdate);
            }
            catch (Exception e)
            {
                throw new UpdateAgenciaException(e.Message);
            }
        }

        public void delete(int id)
        {
			DALAgencia dalAgencia = new DALAgencia();
			DALReserva dalReserva = new DALReserva();
			DALContacto dalContacto = new DALContacto();
			
			
			List<BTO.Reserva> listReservas = dalReserva.getByAgencia(id);
			if (listReservas.Count()>0) {
				throw new ReservasAssociadasAgenciaException("Existem reservas associadas à esta agencia!");
			}
			
			List<BTO.Contacto> listContactos = dalContacto.getByAgencia(id);
			if (listContactos.Count()>0) {
				throw new ContactosAssociadosAgenciaException("Existem contactos associadas à esta agencia!");
			}
			
			try
            {
				dalAgencia.delete(id);
            }
            catch (Exception e)
            {
                throw new DeleteAgenciaException(e.Message);
            }
			
        }
    }
}
